#ifndef ElementoParseado_H
#define ElementoParseado_H

#include <stddef.h>
#include <stdbool.h>
#include "lista.h"
#include "Ubicador.h"
#include "vector_dinamico.h"

/* *****************************************************************
 *                DEFINICION DE LOS TIPOS DE DATOS
 * *****************************************************************/

/* Estructura diseñada para almacenar un elemento parseado y la ubicación
 * de todas sus apariciones en el volumen de datos. */
typedef struct _ElementoParseado ElementoParseado_t;

/* *****************************************************************
 *                PRIMITIVAS DEL ELEMENTO PARSEADO
 * *****************************************************************/

/* Crea y devuelve un ElementoParseado. 'cadena' es la palabra o frase
 * parseada y 'longitud' su largo. En caso de error, devuelve NULL */
ElementoParseado_t* ElementoParseado_crear (char* cadena, int longitud);

/* Devuelve true si logró agregar la ubicación exitosamente, false en
 * caso contrario */
bool ElementoParseado_agregarUbicacion (ElementoParseado_t* elem, int pos, int archivo);

/* Borra la ubicación determinada por la posicion y el archivo pasados
 * por parámetro */
void ElementoParseado_borrarUbicacion (ElementoParseado_t* elem, int pos, int archivo);

/* Devuelve una lista con todas las ubicaciones del elemento en formato
 * Ubicador_t.
 * IMPORTANTE: La lista NO debe ser destruida. */
lista_t* ElementoParseado_verUbicaciones (ElementoParseado_t* elem);

/* Devuelve un vector dinámico con int* correspondientes a los documentos
 * en los que aparece */
vector_dinamico_t* ElementoParseado_verArchivos (ElementoParseado_t* elem);

/* Devuelve la cantidad de ubicaciones del Elemento parseado */
int ElementoParseado_verCantidadUbicaciones (ElementoParseado_t* elem);

/* Devuelve el nombre de la cadena Parseada o Null si elem no existe*/
char* ElementoParseado_verCadenaParseada(ElementoParseado_t* elem);

/* Devuelve la longitud de la cadena Parseada o -1 si elem no existe*/
int ElementoParseado_verLongitud(ElementoParseado_t* elem);

/* Destruye el ElementoParseado pasado por parámetro */
void ElementoParseado_destruir (ElementoParseado_t* elem);

#endif //  ElementoParseado_H
